Nacos 是一个由阿里巴巴开源的、功能丰富的平台,主要用于动态服务发现、配置管理和服务管理。在现代微服务架构中,它扮演着至关重要的“注册中心”和“配置中心”的角色。
可以把它想象成微服务世界里的“电话簿 + 公告栏”:
- 电话簿(服务发现):每个微服务启动时,都把自己的“姓名”(服务名)和“电话号码”(IP地址和端口)登记到 Nacos。其他服务想找它时,就去 Nacos 查一下电话号码,然后就能联系上了。
- 公告栏(配置管理):管理员在 Nacos 上发布或更新“公告”(配置信息)。所有微服务都会盯着这个公告栏,一旦有新内容,就立刻拿来使用,而且整个过程不需要重启服务。
一、核心功能
Nacos 主要有两大核心功能:
-
服务注册与发现 (Service Discovery and Registration)
- 服务注册:服务提供者(Provider)在启动时将自己的信息(服务名、IP、端口等)注册到 Nacos Server。
- 服务发现:服务消费者(Consumer)向 Nacos Server 查询指定服务名的提供者列表,并获取其实例信息。
- 心跳检测:Nacos Server 会定时向注册的服务实例发送心跳请求,如果某个实例长时间没有响应,就会被认为是“不健康”并从服务列表中剔除,从而保证了服务调用的高可用性。
-
动态配置管理 (Dynamic Configuration Management)
- 集中管理:将所有服务的配置文件(如数据库连接、第三方服务密钥、业务开关等)集中存放在 Nacos Server,而不是散落在各个服务的代码包里。
- 动态刷新:当配置发生变化时,Nacos Server 会主动通知监听了该配置的微服务。服务在收到通知后,可以动态地加载新配置,无需重启应用。这对于实现灰度发布、功能开关、动态降级等非常有用。
- 多环境/多版本管理:通过
Namespace
和Group
的概念,可以轻松实现不同环境(开发、测试、生产)和不同分组的配置隔离。
二、如何开始使用 Nacos
1. 安装与启动 Nacos Server
对于初学者,最快的方式是使用单机模式。
前提条件:已安装 Java 8 或更高版本。
步骤:
-
下载:从 Nacos 的 GitHub Releases 页面下载最新的稳定版压缩包(例如
nacos-server-x.x.x.zip
)。 -
解压:将下载的压缩包解压到任意目录。
-
启动:
- Windows: 进入
nacos/bin
目录,双击startup.cmd
,或者在命令行中执行startup.cmd -m standalone
。 - Linux/macOS: 进入
nacos/bin
目录,执行命令sh startup.sh -m standalone
。
standalone
参数表示以单机模式启动。生产环境应使用集群模式。 - Windows: 进入
-
访问控制台: 启动成功后,在浏览器中访问
http://127.0.0.1:8848/nacos
。 默认的用户名和密码都是nacos
。
登录后你就能看到 Nacos 的管理界面,可以在这里查看服务列表和管理配置文件。
三、在 Spring Cloud 中集成 Nacos
下面我们以最常见的 Java 微服务框架 Spring Cloud Alibaba 为例,演示如何使用 Nacos。
场景:一个服务提供者 (Provider) 和一个服务消费者 (Consumer)。
1. 使用 Nacos 作为注册中心
a. 添加依赖
在 pom.xml
中为 Provider 和 Consumer 都添加 Nacos Discovery 依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
(注意:请确保你的 Spring Cloud 和 Spring Cloud Alibaba 版本兼容)
b. 配置 application.yml
服务提供者 (provider-service):
server:
port: 8081
spring:
application:
name: provider-service # 服务名
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos Server 地址
服务消费者 (consumer-service):
server:
port: 8082
spring:
application:
name: consumer-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
c. 启用服务发现
在两个服务的 Spring Boot 启动类上都添加 @EnableDiscoveryClient
注解。
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
d. 验证
- 启动 Nacos Server。
- 启动
provider-service
。 - 访问 Nacos 控制台
http://127.0.0.1:8848/nacos
,在“服务管理” -> “服务列表”中,你应该能看到名为provider-service
的服务,并且有一个健康实例。
e. 服务调用
在 Consumer 端,你可以使用 RestTemplate
或 OpenFeign
来调用 Provider 的接口。通过 @LoadBalanced
注解,Spring Cloud 会自动从 Nacos 获取 provider-service
的地址并进行负载均衡。
// 在 Consumer 的配置类中
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced // 开启负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// 在 Consumer 的 Controller 或 Service 中
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call-provider")
public String callProvider() {
// 直接使用服务名,而不是硬编码 IP 和端口
String result = restTemplate.getForObject("http://provider-service/some-endpoint", String.class);
return "Result from provider: " + result;
}
}
2. 使用 Nacos 作为配置中心
a. 添加依赖
在需要使用 Nacos 配置的微服务中(比如 provider-service
),添加 Nacos Config 依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
b. 创建 bootstrap.yml
重要:Nacos 配置的加载优先级高于 application.yml
,所以必须在 bootstrap.yml
文件中配置 Nacos 地址。
在 provider-service
的 src/main/resources
目录下创建 bootstrap.yml
:
spring:
application:
name: provider-service
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # Nacos Server 地址
file-extension: yml # 指定配置文件格式为 yml
# group: DEV_GROUP # 可以指定分组,默认为 DEFAULT_GROUP
# namespace: xxxxx-xxxx-xxxx # 可以指定命名空间ID
c. 在 Nacos 控制台创建配置
- 登录 Nacos 控制台。
- 进入“配置管理” -> “配置列表”。
- 点击右上角的“+”号创建新配置。
- 填写配置信息:
- Data ID:
provider-service.yml
(默认规则是${spring.application.name}.${file-extension}
) - Group:
DEFAULT_GROUP
(除非你在bootstrap.yml
中指定了其他组) - 配置格式:
YAML
- 配置内容:
user: name: "Alice from Nacos" age: 25
- Data ID:
- 点击“发布”。
d. 在代码中动态读取配置
在 provider-service
的代码中,使用 @Value
注解来注入配置。为了让配置能动态刷新,需要在对应的类上添加 @RefreshScope
注解。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope // 允许配置动态刷新
public class ConfigController {
@Value("${user.name}")
private String userName;
@Value("${user.age}")
private Integer userAge;
@GetMapping("/config")
public String getConfig() {
return "User Name: " + userName + ", Age: " + userAge;
}
}
e. 验证动态刷新
- 启动
provider-service
。 - 访问
http://localhost:8081/config
,你会看到User Name: Alice from Nacos, Age: 25
。 - 回到 Nacos 控制台,编辑
provider-service.yml
配置,将user.name
改为"Bob from Nacos"
,然后发布。 - 无需重启服务,再次访问
http://localhost:8081/config
,你会发现返回内容已经变成了User Name: Bob from Nacos, Age: 25
。
四、Nacos 的关键概念
- Namespace (命名空间):用于进行租户级别的配置隔离。不同的命名空间下,可以有相同
Group
和Data ID
的配置。常用于区分不同的环境,如dev
、test
、prod
环境。 - Group (分组):将不同的配置集进行逻辑分组。例如,可以按业务模块或项目来划分,如
trade-group
、user-group
。 - Data ID (数据ID):通常是配置文件的名称,是配置的唯一标识。
这三者共同确定一个唯一的配置。
总结
Nacos 通过将服务注册和配置管理两大功能合二为一,极大地简化了微服务架构的复杂性。它的优势在于:
- 功能整合:一个组件解决两大核心问题,降低了技术栈的复杂度和维护成本。
- 易于使用:提供了友好的控制台界面,上手简单。
- 动态性强:无论是服务实例的上下线,还是配置的变更,都能被实时感知,无需重启应用。
- 生态融合好:与 Spring Cloud 生态无缝集成,是 Spring Cloud Alibaba 技术栈的首选。
- 支持多环境:通过 Namespace 机制,天然支持开发、测试、生产等多环境隔离。